package com.ck.ips.dao.program;

import com.ck.common.model.DeviceGroup;
import com.ck.common.model.Program;
import com.ck.ips.model.vo.program.*;
import com.github.pagehelper.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author LinQiang
 * @version 1.0
 * @Description 节目MAPPER
 * @date 2019/4/29 14:24
 **/
public interface ProgramMapper {
    int deleteByPrimaryKey(Long programId);

    int insert(Program record);

    Program selectByPrimaryKey(Long programId);

    int updateByPrimaryKeySelective(Program record);

    int updateByPrimaryKey(Program record);

    /**
     * 根据节目版本号查询节目
     *
     * @param programVersion 节目版本号
     * @return Program
     */
    Program selectByProgramVersion(String programVersion);

    /**
     * 分页查询
     *
     * @param programName       节目名称
     * @param programStatus     节目状态
     * @param programOrigin     节目来源
     * @param deviceGroupIdList 投放区域（终端组ID,多个英文逗号隔开）
     * @param deviceType        终端类型（横屏，竖屏等）
     * @param currentTimeMills  当前时间毫秒
     * @return Page
     */
    Page<ProgramListVO> listByPage(@Param("programName") String programName,
                                   @Param("programStatus") Integer programStatus,
                                   @Param("brandId") Integer brandId,
                                   @Param("programOrigin") String programOrigin,
                                   @Param("deviceGroupIdList") List<String> deviceGroupIdList,
                                   @Param("deviceType") String deviceType,
                                   @Param("currentTimeMills") Long currentTimeMills);

    /**
     * 批量更新节目（有值的字段）
     *
     * @param programList 节目
     * @return 影响行数
     */
    int batchUpdateSelective(@Param("programList") List<Program> programList);

    /**
     * 根据终端类型和分辨率筛选出可选的节目列表分页
     *
     * @param deviceType        设备类型（多个英文逗号隔开，排序后）
     * @param resolution        分辨率（多个英文逗号隔开，排序后）
     * @param programName       节目名称
     * @param origin            来源
     * @param deviceGroupIdList 终端组（区域）
     * @param currentTimeMills  当前时间
     * @return Page
     */
    List<ProgramListVO> filterProgramWithDevicesByPage(@Param("deviceType") String deviceType,
                                                       @Param("resolution") String resolution,
                                                       @Param("programName") String programName,
                                                       @Param("origin") String origin,
                                                       @Param("deviceGroupIdList") List<String> deviceGroupIdList,
                                                       @Param("currentTimeMills") Long currentTimeMills);

    /**
     * 查询节目详情
     *
     * @param customerName     客户名称
     * @param programVersion   节目版本号
     * @param currentTimeMills 当前时间戳
     * @return ProgramDetailVO
     */
    ProgramDetailVO getDetail(@Param("customerName") String customerName,
                              @Param("programVersion") String programVersion,
                              @Param("currentTimeMills") Long currentTimeMills);

    /**
     * 统计节目信息（投放终端数，终端组数，下发和下载统计等）
     *
     * @param programVersion 节目版本号
     * @param nowTime        当前时间戳
     * @return ProgramStatisticsInfoVO
     */
    ProgramStatisticsInfoVO getStatisticsInfo(@Param("programVersion") String programVersion, @Param("nowTime") Long nowTime);

    /**
     * 获取节目投放区域，下发详情，下载详情列表分页
     *
     * @param programVersion 节目版本号
     * @param deviceName     设备名称
     * @param deviceCode     设备序列号
     * @param nowTime        当前时间戳
     * @return Page
     */
    Page<ProgramDeviceDetailVO> getDevicesByPage(@Param("programVersion") String programVersion,
                                                 @Param("deviceName") String deviceName,
                                                 @Param("deviceCode") String deviceCode,
                                                 @Param("nowTime") Long nowTime);

    /**
     * 根据节目名称统计
     *
     * @param programVersion 节目版本号
     * @param programName    节目名称
     * @return 条数
     */
    int countByName(@Param("programVersion") String programVersion, @Param("programName") String programName);

    /**
     * 获取待播放和播放中的节目列表
     *
     * @return List
     */
    List<Program> getToPlayAndPlayingPrograms();

    /**
     * 根据节目版本号统计设备数
     *
     * @param programVersion 节目版本号
     * @return 条数
     */
    int countDeviceProgramByProgramVersion(@Param("programVersion") String programVersion);

    /**
     * 根据终端类型和分辨率筛选出可选的节目所投放的终端
     *
     * @param resolutions 设备分辨率
     * @return OperationResult
     */
    List<String> listProgramPutinDeviceCodesBySelectDeviceCodes(@Param("resolutions") String resolutions);

    /**
     * 查询列表
     *
     * @param customerName     API客户名称
     * @param currentTimeMills 当前时间毫秒
     * @return OperationResult
     */
    Page<ProgramListVO> list(@Param("customerName") String customerName, @Param("currentTimeMills") Long currentTimeMills);

    /**
     * 删除节目（逻辑删除）
     *
     * @param programVersion 节目版本号
     */
    void deleteByProgramVersion(@Param("programVersion") String programVersion);

    /**
     * 获取终端当前最新节目版本号
     *
     * @param deviceCode       终端序列号
     * @param currentTimeMills 当前时间
     * @return List
     */
    List<String> getNestProgramVersionsByDeviceCode(@Param("deviceCode") String deviceCode, @Param("currentTimeMills") Long currentTimeMills);


    /**
     * 获取终端当前的素材播放列表
     * 待播放的和正在播放的
     *
     * @param deviceCode      设备序列号
     * @param programVersions 节目版本号
     * @param sourceName      素材名称
     * @param resolution      分辨率
     * @return List
     */
    List<ProgramPlayListVO> getNewestSourcesByDeviceCode(@Param("deviceCode") String deviceCode,
                                                         @Param("programVersions") List<String> programVersions,
                                                         @Param("sourceName") String sourceName,
                                                         @Param("resolution") String resolution);

    /**
     * 获取终端当前的素材播放列表
     * 待播放的和正在播放的
     *
     * @param deviceCode      设备序列号
     * @param programVersions 节目版本号
     * @param sourceName      素材名称
     * @param resolution      分辨率
     * @return List
     */
    List<ProgramPlayListVO> getNewestSourcesByDeviceCodeNew(@Param("deviceCode") String deviceCode,
                                                            @Param("programVersions") List<String> programVersions,
                                                            @Param("sourceName") String sourceName,
                                                            @Param("resolution") String resolution);
    /**
     * 获取终端当前的素材统计信息
     * 待播放的和正在播放的
     *
     * @param deviceCode      设备序列号
     * @param programVersions
     * @return ProgramDeviceCurrentSourcesStaticInfo
     */
    ProgramDeviceCurrentSourcesStaticInfo getCurrentSourcesStaticInfoByDeviceCode(@Param("deviceCode") String deviceCode,
                                                                                  @Param("programVersions") List<String> programVersions);

    /**
     * 根据终端统计增播和减播次数统计
     *
     * @param deviceCodeList 设备序列号
     * @return DeviceAddAndReducedStatisticVO
     */
    List<DeviceAddAndReducedStatisticVO> getAddedAndReducedStatisticInfoByDeviceCodes(@Param("deviceCodeList") List<String> deviceCodeList);

    /**
     * 获取所有节目投放的终端组
     *
     * @return
     */
    List<DeviceGroup> getDeviceGroupSelect();

    /**
     * 统计节目信息（投放时间，投放终端数，终端组数）
     *
     * @param programVersion 节目版本号
     * @param nowTime        当前时间戳
     * @return ProgramStatisticsInfoVO
     */
    ProgramStatisticsInfoVO getBaseStatisticsInfo(@Param("programVersion") String programVersion, @Param("nowTime") Long nowTime);


    /**
     * 统计节目信息（下载，下发）
     *
     * @param programVersion 节目版本号
     * @param nowTime        当前时间戳
     * @return ProgramStatisticsInfoVO
     */
    ProgramStatisticsInfoVO getPushAndDownloadStatisticsInfo(@Param("programVersion") String programVersion, @Param("nowTime") Long nowTime);

    /**
     * 更新节目播放排序
     *
     * @param programVersion 节目版本号
     * @param rank           播放排序
     */
    void updateProgramRank( @Param("programVersion") String programVersion, @Param("rank") Long rank);
}